home *** CD-ROM | disk | FTP | other *** search
/ PCMania 73 / PCMania CD73_1.iso / pcmania / metafo73 / SRC.ZIP / QUIMICA.C next >
Text File  |  1998-09-25  |  7KB  |  289 lines

  1.  
  2. /****************************************************************************
  3.    Copyright (C) 1998 by Rafael Hernández Moreno
  4.  
  5.  
  6. *****************************************************************************
  7.  
  8.                     GARANTIA
  9.       El programa se proporciona sin ninguna garantía, explícita o
  10.  implícita y no existe garantía sobre la funcionalidad del código
  11.  fuente, módulos objeto, módulos ejecutables y ficheros de datos
  12.  que use. El autor no será responsable por cualquier daño o
  13.  perjuicio causado por el uso o mal uso de este producto.
  14.  
  15.       No hay garantías de que este programa se ejecute sin errores o
  16.  haga exactamente lo que el autor o el usuario intentaban hacer.
  17.  Este programa no debe ser utilizado junto a aplicaciones o en sistemas
  18.  donde el funcionamiento erróneo del mismo pueda causar pérdida o
  19.  daños a la propiedad o salud de cualquier persona.
  20.  
  21.  
  22.  
  23.  
  24.                     DISCLAIMER AND WARRANTY
  25.          Product is supplied as is and author disclaims all warranties,
  26.    explicit or implied, about the functionality of the source code,
  27.    object modules supplied, executable modules and data,and shall not be held
  28.    responsible for any damages caused by the use or misuse of this product.
  29.  
  30.          And, there is no warranty that this program performs without errors,
  31.    or does exactly what you or I intended. So it should NOT be
  32.    used in applications in which malfunction of routines of this
  33.    package would result in loss or damage to property or health of any
  34.    person without *very* extensive testing under all kinds of loads.
  35.    In using it, you do so at your own risk.
  36. */
  37.  
  38.  
  39.  
  40. #include <graphics.h>
  41. #include <time.h>
  42. #include <stdio.h>
  43. #include <math.h>
  44. #include <string.h>
  45. #include <conio.h>
  46. #include <stdlib.h>
  47.  
  48. #define LMOLEC  20   /* Longitud maxima de las moleculas   */
  49. #define NREAC 100
  50. #define NMOLS 20
  51.  
  52. #define ALICUOTA    0.1   /* Cantidad de reactivos que intervienen en cada reacción */
  53.  
  54. typedef struct _reaccion_
  55. {
  56.     int molec1, molec2, enzima, producto;
  57.     double velocidad;    
  58. } reaccion;
  59.  
  60. typedef struct _molecula_
  61. {
  62.     char m[LMOLEC];
  63.     double cn;   /* concentracion  */
  64. } molecula;
  65.  
  66.  
  67.  
  68. void inicializa_drivers(void);
  69. int crea_molecula(int);
  70. int mezcla_quimica(void);
  71. int grafo_reacciones(void);
  72. int reacciones(int);
  73. int presentacion_cabecera(void);
  74. int presentacion(int);
  75.  
  76.     
  77. reaccion reacc[NREAC];
  78. molecula mol[NMOLS];
  79. int x_hi, y_hi;
  80. int numreacciones, nummolecs; 
  81.  
  82.  
  83.  
  84. void inicializa_drivers(void)
  85. {
  86.    int driver_graf=DETECT, modo_graf, error_graf;
  87.  
  88.    detectgraph(&driver_graf, &modo_graf);
  89.    error_graf = graphresult();
  90.    if (error_graf <0)
  91.       {
  92.          printf( "Error gráfico : %s.\n", grapherrormsg(error_graf));
  93.          exit(1);
  94.       }
  95.  
  96.    if (driver_graf == VGA)
  97.       {
  98.          modo_graf = VGAHI;
  99.          x_hi=639;
  100.          y_hi=479;
  101.          registerbgidriver(EGAVGA_driver);
  102.       }
  103.    else
  104.       {
  105.          printf("Driver gráfico no soportado\n");
  106.          exit(1);
  107.       }
  108.  
  109.    error_graf = graphresult();
  110.    if (error_graf <0)
  111.       {
  112.          printf("Error gráfico : %s.\n", grapherrormsg(error_graf));
  113.          exit(1);
  114.       }
  115.  
  116.    initgraph(&driver_graf, &modo_graf, "");
  117.    error_graf = graphresult();
  118.    if (error_graf <0)
  119.       {
  120.          printf("Error gráfico al inicializar el driver : %s.\n", grapherrormsg(error_graf));
  121.          exit(1);
  122.       }
  123. }
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131. int crea_molecula(int i)
  132. {
  133.     int j, l;
  134.  
  135.     l = random(LMOLEC - 2) + 2; /* longitud al menos > 2 */
  136.     mol[i].m[0] = 0;
  137.     for (j = 0; j < l; ++j)
  138.     {
  139.         if (random(100) < 50) strcat(mol[i].m, "a");
  140.         else strcat(mol[i].m, "b");
  141.     }
  142.     return 0;    
  143. }
  144.  
  145.  
  146.  
  147. int mezcla_quimica(void)
  148. {
  149.     int i;
  150.  
  151.     /* Las dos primeras moléculas son los elementos de partida */
  152.     /* No pueden ser nunca productos */
  153.     /* Y se van a mantener a concentración constante, "no se gastan" */
  154.     /* o lo que es lo mismo siempre se está añadiendo ingredientes de partida */
  155.     /* a nuestra sopa química */
  156.  
  157.     mol[0].m[0] = 0;
  158.     strcpy(mol[0].m, "a");
  159.     mol[0].cn = 1.0;
  160.  
  161.     mol[1].m[0] = 0;
  162.     strcpy(mol[1].m, "b");
  163.     mol[1].cn = 1.0;
  164.  
  165.     for (i = 2; i < nummolecs; ++i)
  166.     {
  167.         crea_molecula(i);
  168.         mol[i].cn = 1.0;
  169.     }
  170.     return 0;    
  171. }
  172.  
  173.  
  174. int grafo_reacciones(void)
  175. {
  176.     int i;
  177.  
  178.     for (i = 0; i < numreacciones; ++i)
  179.     {
  180.         reacc[i].molec1 = random(NMOLS);
  181.         reacc[i].molec2 = random(NMOLS);
  182.         reacc[i].enzima = random(NMOLS);
  183.     /* Las dos primeras moléculas no pueden ser productos */
  184.         reacc[i].producto = random(NMOLS - 2) + 2; 
  185.         reacc[i].velocidad = (random(32000) * 1.0) / 32000;
  186.     }
  187.     return 0;
  188. }
  189.  
  190.  
  191. int reacciones(int i)
  192. {
  193.     double gasto;
  194.  
  195.  
  196.     /* Si no hay reactivos ni enzima suficientes no se realiza la reacción */
  197.     gasto = ALICUOTA * reacc[i].velocidad;
  198.     if ((reacc[i].molec1 == reacc[i].molec2) && (reacc[i].molec1 < (2 * gasto)))
  199.          return 0;
  200.     if (mol[reacc[i].molec1].cn < gasto)    return 0;
  201.     if (mol[reacc[i].molec2].cn < gasto)    return 0;
  202.  
  203.     /* La enzima no se gasta en la reaccion, pero debe existir */
  204.     if (mol[reacc[i].enzima].cn < gasto)    return 0;
  205.  
  206.     /* Las dos moléculas iniciales 0 y 1 no se gastan nunca son los nutrientes */
  207.     if (reacc[i].molec1 > 1) mol[reacc[i].molec1].cn -= gasto;
  208.     if (reacc[i].molec2 > 1) mol[reacc[i].molec2].cn -= gasto;
  209.     
  210.     reacc[i].producto += 2 * gasto; 
  211.     return 0;
  212. }
  213.  
  214.  
  215.  
  216. int presentacion_cabecera(void)
  217. {
  218.     int i, yy;
  219.  
  220.     for (i = 0; i < nummolecs; ++i)
  221.     {
  222.         yy = i * 20 + 20;
  223.         outtextxy(0, yy, mol[i].m);
  224.         outtextxy(150, yy, " : ");
  225.         presentacion(i);
  226.     }
  227.     return 0;
  228. }
  229.  
  230. int presentacion(int i)
  231. {
  232.     int yy;
  233.     char linea[80];
  234.  
  235.     yy = i * 20 + 20;
  236.     setviewport(200, yy - 9, x_hi, yy + 12, 1);
  237.     clearviewport();
  238.     setviewport(0, 0, x_hi, y_hi, 1);
  239.     linea[0] = 0;
  240.     sprintf(linea, "%f", mol[i].cn);
  241.     outtextxy(200, yy, linea);
  242.     bar3d(300, yy + 10, 300 + (mol[i].cn * 100), yy, 10, 1); 
  243.     return 0;
  244. }
  245.  
  246.  
  247.  
  248.  
  249. int main(int argc, char **argv)
  250. {
  251.     int i;
  252.     char c = 0;
  253.     int salir = 0;
  254.  
  255.     if (argc != 3) 
  256.     {
  257.         printf("Sintaxis : \n   %s <numreacciones> <nummolecs>\n", argv[0]);
  258.         return 0;
  259.     }
  260.  
  261.     numreacciones = atoi(argv[1]);
  262.     if (numreacciones > NREAC) numreacciones = NREAC;
  263.  
  264.     nummolecs = atoi(argv[2]);
  265.     if (nummolecs > NMOLS) nummolecs = NMOLS;
  266.  
  267.     mezcla_quimica();
  268.     grafo_reacciones();
  269.  
  270.     inicializa_drivers();
  271.  
  272.     presentacion_cabecera();
  273.  
  274.     do   
  275.     {
  276.         i = random(NREAC);
  277.         reacciones(i);
  278.         presentacion(reacc[i].molec1);
  279.         presentacion(reacc[i].molec2);
  280.         presentacion(reacc[i].producto);
  281.         if (kbhit()) c = getch();
  282.         if (c == 'q') salir = 1;
  283.     } while (!salir);
  284.  
  285.     closegraph();
  286.  
  287.     return 0;
  288. }
  289.